package exo4;

import java.util.ArrayList;
import java.util.List;

public class Bibliotheque {
	private List<Ouvrage> ouvrages;
	private List<Abonne> abonnes;

	public Bibliotheque() {
		ouvrages = new ArrayList<Ouvrage>();
		abonnes = new ArrayList<Abonne>();
	}

	public Bibliotheque(List<Ouvrage> ouvrages, List<Abonne> abonnes) {
		this.ouvrages = ouvrages;
		this.abonnes = abonnes;
	}

	public List<Ouvrage> getOuvrages() {
		return ouvrages;
	}

	public void setOuvrages(List<Ouvrage> ouvrages) {
		this.ouvrages = ouvrages;
	}

	public List<Abonne> getAbonnes() {
		return abonnes;
	}

	public void setAbonnes(List<Abonne> abonnes) {
		this.abonnes = abonnes;
	}

	public boolean addAbonne(Abonne abo) {
		return abonnes.add(abo);
	}

	public boolean addOuvrage(Ouvrage ouv) {
		return ouvrages.add(ouv);
	}

	/*
	 * Fonction emprunter : (si pas réservé et disponible) 
	 * - remplit le champ emprunteur de Ouvrage 
	 * - remplit le champ disponibilité de Ouvrage à false
	 * - ajoute l'ouvrage dans la liste des emprunts de l'abonné
	 */

	public void emprunter(Ouvrage ouvrage, Abonne abonne) {
		if (ouvrage.isDisponibilite() == true) {
			if (ouvrage.isEtatReservation() == false) {
				ouvrage.setDisponibilite(false);
				ouvrage.setEmprunteur(abonne);
				abonne.getEmprunts().add(ouvrage);
			} else {
				System.out.println("Le livre " + ouvrage.getTitre()
						+ " que souhaite emprunter " + abonne.getNom()
						+ " est réservé.");
			}
		} else {
			System.out.println("Le livre " + ouvrage.getTitre()
					+ " que souhaite emprunter " + abonne.getNom()
					+ " est indisponible.");
		}
	}

	/*
	 * Fonction réserver un ouvrage : (si pas réservé) 
	 * - remplit le champ etatReservation de Ouvrage à true 
	 * - remplit le champ reserveur de Ouvrage
	 * - ajoute l'ouvrage dans la liste des réservations de l'abonné
	 */

	public void reserver(Ouvrage ouvrage, Abonne abonne) {
		if (ouvrage.isEtatReservation() == false) {
			ouvrage.setEtatReservation(true);
			ouvrage.setReserveur(abonne);
			abonne.getReservations().add(ouvrage);
		} else {
			System.out.println("Le livre " + ouvrage.getTitre()
					+ " que souhaite réserver " + abonne.getNom()
					+ " est réservé.");
		}
	}

	/*
	 * Fonction restituer un ouvrage emprunté : 
	 * - remplit le champ disponibilité de Ouvrage à true
	 * - supprime le champ emprunteur de Ouvrage
	 * - supprime l'ouvrage dans la liste des emprunts de l'abonné
	 * Si l'ouvrage est réservé :
	 * - remplit le champ etatReservation de Ouvrage à false
	 * - appelle la fonction emprunter
	 * - supprime l'ouvrage dans la liste des réservations du réserveur
	 * - supprime le champ reserveur de Ouvrage
	 */

	public void restituer(Ouvrage ouvrage, Abonne abonne) {
		ouvrage.setDisponibilite(true);
		ouvrage.setEmprunteur(null);
		abonne.getEmprunts().remove(ouvrage);
		if(ouvrage.isEtatReservation() == true) {
			ouvrage.setEtatReservation(false);
			emprunter(ouvrage,ouvrage.getReserveur());
			ouvrage.getReserveur().getReservations().remove(ouvrage);
			ouvrage.setReserveur(null);	
		}
	}

}
